#include <iostream>
#include <algorithm>
using namespace std;
int a[1005],n;
struct note
{
    int x,y,z;
};
int cmp(note a,note b)
{
    return a.z<b.z;
}
void ini()
{
    for(int i=0;i<=n;i++)
    {
        a[i]=i;
    }
}
int find(int x)
{
    if(x==a[x])
        return x;
    return a[x]=find(a[x]);
}
void un(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)
       return;
    if(x>y)
    {
      a[x]=y;
    }
    else if(x<y)
    {
        a[y]=x;
    }
}
int main()
{
    int m;
    note ab[1005];
    while(true)
    {
        cin>>m>>n;
        if(m==0)
            break;
        ini();
        for(int i=0;i<m;i++)
        {
            cin>>ab[i].x>>ab[i].y>>ab[i].z;
        }
        sort(ab,ab+m,cmp);
        int cot=0;
        int sum=0;
        for(int i=0;i<m;i++)
        {
            if(find(ab[i].x)!=find(ab[i].y))
            {
                un(ab[i].x,ab[i].y);
                sum+=ab[i].z;
                cot++;
                if(cot==n-1)
                   break;
            }
        }
        if(cot<n-1)
            cout<<"?"<<endl;
        else
             cout<<sum<<endl;
    }
    return 0;
}